package com.dji.sdk.cloudapi.config.api;

import com.dji.sdk.cloudapi.config.ProductConfigResponse;
import com.dji.sdk.cloudapi.config.RequestsConfigRequest;
import com.dji.sdk.mqtt.ChannelName;
import com.dji.sdk.mqtt.requests.TopicRequestsRequest;
import com.dji.sdk.mqtt.requests.TopicRequestsResponse;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.messaging.MessageHeaders;

/**
 * 配置服务抽象类
 *
 * 该类是配置服务的核心抽象类，定义了处理设备配置请求的标准接口。
 * 作为DJI Cloud API中MQTT通信架构的一部分，它负责：
 * 1. 接收并处理设备在上云过程中发送的配置请求
 * 2. 根据请求中的配置类型和范围，返回相应的配置信息
 * 3. 处理License校验相关的业务逻辑
 *
 * 具体实现类(如RequestConfigContext)需要继承该抽象类并实现requestsConfig方法，
 * 以提供实际的配置处理逻辑。
 *
 * 通过@ServiceActivator注解，Spring Integration将自动将指定Channel中的消息
 * 路由到此方法进行处理，并将处理结果发送到输出Channel。
 *
 * @author sean
 * @version 1.7
 * @date 2023/6/29
 */
public abstract class AbstractConfigService {

    /**
     * 处理配置请求的方法
     *
     * 该方法通过Spring Integration的@ServiceActivator注解被激活，
     * 当有消息到达INBOUND_REQUESTS_CONFIG通道时会被调用。
     *
     * 实现此方法的子类需要：
     * 1. 验证配置请求参数
     * 2. 根据请求参数获取相应的配置信息
     * 3. 生成包含配置信息的响应对象
     * 4. 响应对象将通过OUTBOUND_REQUESTS通道返回给请求方
     *
     * 在DJI设备连接云平台的流程中，该方法承担着License校验的重要职责。
     *
     * @param request  配置请求数据，包含配置类型和范围等信息
     * @param headers  消息头信息，包含标识、时间戳等元数据
     * @return 配置响应对象，包含申请的配置信息
     */
    @ServiceActivator(inputChannel = ChannelName.INBOUND_REQUESTS_CONFIG, outputChannel = ChannelName.OUTBOUND_REQUESTS)
    public TopicRequestsResponse<ProductConfigResponse> requestsConfig(TopicRequestsRequest<RequestsConfigRequest> request, MessageHeaders headers) {
        throw new UnsupportedOperationException("requestsConfig not implemented");
    }

}